<?php
if(!defined('BASE_DIR'))die('Cannot access the file !');
/**
 * -+-----------------------------------------
 * |PHP Framework
 * |Copyright (c) 2010 jinke.[iblue.cc]
 * |E-mail: mejinke@gmail.com
 * |Date:  2010-03-08
 * |Update: 2010-11-30
 * -+-----------------------------------------
 *
 * 系统路由，主要用于URI的解析与分配
 * @author jinke
 */
class Router extends Base
{

	/**
	 * 交换资料数组
	 * @var array
	 */
	private $_tep = array();


	/**
	 * 当前请求的控制器
	 * @var string
	 */
	private $_controllerName = '';

	/**
	 * 请求的动作Action
	 * @var string
	 */
	private $_actionName = 'index';


	/**
	 * 请求的参数列表
	 * @var array
	 */
	private $_args = array();
	
	
	private $_uri = '';



	/**
	 * 构造函数 初化始config配置信息
	 */
	public function __construct($uri = '')
	{
		$this->_uri = $uri;
		Debug::initClass('Router.class.php');
	}


    /**
     * 获取当前控制器名称
     * @return string
     */
	public function getControllerName()
	{
		return $this->_controllerName;
	}


	/**
	 * 获取当前Action
	 * @return string
	 */
	public function getActionName()
	{
		return $this->_actionName;
	}


	/**
	 * 获取所有的参数
	 * @return array
	 */
	public function getArgs()
	{
		return $this->_args;
	}


	/**
	 * 设置控制器名称
	 * @param string $controller
	 * @return void
	 */
	public function setController($controllerName)
	{
		$this->_controllerName = $controllerName;
	}


	/**
	 * 设置Action名称
	 * @param $action
	 * @return void
	 */
	public function setAction($actionName)
	{
		$this->_actionName = $actionName;
	}


    /**
	 * 分析URI信息
	 * @access public
	 * @return void
	 */
	public function get()
	{

		$tep_array = array();
		if ($this->_uri == '')
			$this->_uri=$_SERVER['PHP_SELF'];
		Debug::$uris=$this->_uri;
		
		//拆分URI
		if(strpos($this->_uri,'.php/'))
		{
			$this->_tep = explode('.php/',$this->_uri);
			if(isset($this->_tep[1]) && $this->_tep[1]!='')
			{	
				$tep_array = explode('/',$this->_tep[1]);
				$this->correctUrlArray($tep_array);
				$this->actionIsExists($tep_array);

				
			}
			else
				$this->checkAction();
		}
		else
			$this->checkAction();

		//删除多余的URI内容
		//$this->_tep =	array_untov($this->_tep,'');

		//获取控制器 Controller
		$this->_getController();
		//获取动作 Action
		$this->_getAction();
		//获取参数 Args
		$this->_getArgs();
		//过滤数据
		$this->getOrPostFilter();
		return $this;
	}
	

	
	/**
	 * 深度处理URL，获取正解的URL
	 * @access private
	 * @param Array $array
	 */
	private function correctUrlArray($array)
	{

		if (!is_array($array)) return $array;
	
		for ($i = 1; $i < count($array); $i++) {
			
			//参数值带“/”
			if ($array[$i]=='')
			{	
				$list[] = $i;
				$string = '/';
				for ($j=1;$j<$i; $j++){
					if (!isset($array[$i-$j])) return ;
					if ($array[$i-$j]==''){
						$list[] = $i-$j;
						$string.='/';
					}else{
						$array[$i-$j].=$string;
						$string ='';
						for ($y=0;$y<count($list); $y++){
							unset($array[$list[$y]]);
						}
						$array = array_values($array);
						
						$this->correctUrlArray($array);
					}
				}	
			}
			if (!isset($array[$i])) return ;
			if (strpos($array[$i], '=')===false || strpos($array[$i], '=')==0)
			{	
				$list[] = $i;
				$string = '/'.$array[$i];
				for ($j=1;$j<$i; $j++){
					if (!isset($array[$i-$j])) return ;
					if (strpos($array[$i-$j], '=')===false ||  strpos($array[$i-$j], '=')==0 ){
						$list[] = $i-$j;
						$string.='/'.$array[$i];
					}else{
			
						$array[$i-$j].=$string;
						$string ='';
						for ($y=0;$y<count($list); $y++){
							unset($array[$list[$y]]);
						}
						$array = array_values($array);
					
						$this->correctUrlArray($array);
					}
				}	
			}	
		}
		//$array = array_values(Functions::arrayDeleteEmptyValue($array));
		if (isset($this->_tep[2][0]))
		 return;
		$this->_tep[2] = $array;
	
	}


	/**
	 * 分析Action
	 * @access private
	 * @param string $actionName action名称
	 */
	private function checkAction($actionName='')
	{
		if(!defined('APP_A'))
			empty($actionName) ? $this->_tep[1] = 'index' : $this->_tep[1] = $actionName;
		else
			empty($actionName) ? $this->_tep[1] = APP_A : $this->_tep[1] = $actionName;
	}


	/**
	 * 分析action名称是否存在
	 * @param array $tep_array
	 * @return void
	 */
	private function actionIsExists(&$tep_array)
	{
		if(isset($tep_array[0]))
		{
			if(strpos($tep_array[0],'='))
				$this->checkAction();
			else
			{
				$this->_tep[1] = $tep_array[0];
				unset($tep_array[0]);
			}
		}
		else
			$this->checkAction();
	}


	/**
	 * 分析控制器名称
	 * @access private
	 */
	private function _getController()
	{	
		
		if (!defined('APP_C'))
			message_error('Run Error','没有定义控制名称 APP_C 常量',message_debug(debug_backtrace()));
		$this->_controllerName = APP_C;
	}


	/**
	 * 分析Action名称
	 * @access private
	 */
	private function _getAction()
	{

		if(isset($this->_tep[1]) && is_scalar($this->_tep[1])  &&  $this->_tep[1]!='')
			$this->_actionName = $this->_tep[1];
		else
			$this->_actionName = 'index';
			
	}


	/**
	 * 分析Arg参数列表
	 * @access private
	 */
	private function _getArgs()
	{
		if(isset($this->_tep[2])){
			for($i=0;$i<count($this->_tep[2]);$i++)
			{
				$tep = explode('=',$this->_tep[2][$i]);
				if(isset($tep[0]))
				{	
					if (isset($tep[1]))
					{
						$string = '';
						for ($j=1; $j<count($tep); $j++)
						{
							if ($tep[$j]=='')
								$string.='=';
							else
								$string.=$tep[$j];
						}
						$this->_args[$tep[0]]=$string;
						$_GET[$tep[0]]=$string;
					}
					elseif ($i!=0)
					{
						$this->_args[$tep[0]]='';
						$_GET[$tep[0]]='';
					}
				}
			}
		}
		else
			$this->_args = array();
	}


	/**
	 * 向路由器中添加URL参数
	 * @access public
	 * @param array $array 参数列表
	 */
	public function addArgs(Array $array)
	{
		foreach($array as $key=>$val)
		{
			$this->_args[$key] = $val;
		}
		return $this->_args;
	}


	/**
	 * 自动过滤 GET或 POST中的JS
	 * @access private
	 * @return void
	 */
	private function getOrPostFilter()
	{
		$new_args = array();
		//GET
		if(Config::get('get_filter')===true)
		{
			$args = $this->_args;
			$key = array_keys($args);
			for($i=0;$i<count($args);$i++)
			{
				$new_args[$key[$i]] = String::clearJs($args[$key[$i]]);
			}
			$this->_args = $new_args;
		}
		//POST
		if(Config::get('post_filter')===true)
		{
			$key = array_keys($_POST);
			for($i=0;$i<count($_POST);$i++)
			{
				$_POST[$key[$i]] = String::clearJs($_POST[$key[$i]]);
			}
		}

	}

}
?>